/*
通常 只发送channel类型 和 只接收channel类型 会被用作函数的参数类型或返回值，用于限制对channel内的操作，或者是明确可对channel进行的操作的类型。
运行后,每隔1秒钟会分别输出 1-10
*/

package main

import (
	"sync"
	"time"
)

/*
生产者,使用 只发送channel类型 作为参数类型
*/
func produce(ch chan<- int) {
	for i := 0; i < 10; i++ {
		ch <- i + 1
		time.Sleep(time.Second)
	}
	close(ch) //关闭channel
}

/*
消费者,从channel中接收数据
*/
func consume(ch <-chan int) {
	// for range 会阻塞在channel的接收操作上，直到channel中有数据可接收 或 channel被关闭循环，然后才会继续向下执行。
	for n := range ch {
		print(n, " ")
	}
}
func main() {
	ch := make(chan int, 5)
	var wg sync.WaitGroup
	wg.Add(2)
	go func() {
		produce(ch)
		wg.Done()
	}()

	go func() {
		consume(ch)
		wg.Done()
	}()
	wg.Wait()
}
